package cn.tedu.smartos.uploadfile.service.impl;

import cn.tedu.smartos.base.exception.ServiceException;
import cn.tedu.smartos.base.response.StatusCode;
import cn.tedu.smartos.uploadfile.service.UploadService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Slf4j
@Service
public class UploadServiceImpl implements UploadService {
    private final String baseDir = "D:/files/";

 //   @Override
//    public ResponseEntity<?> uploadImages(MultipartFile[] files) {
//        List<String> fileUrls = new ArrayList<>();
//        String baseDir = "D:/files/";
//
//        //自定义一个日期路径作为文件存储的文件夹,提高检索性能,一般以年月日的格式存储,比如:/2024/10/19
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
//        String datePath = "/" + sdf.format(new Date()) + "/";
//        String uploadDir = baseDir + datePath;
//
//        for (MultipartFile file : files) {
//            if (file.isEmpty()) {
//                continue; // 跳过空文件
//            }
//
//            log.debug("开始处理上传图片业务，参数：{}", file);
//
//            // 获取原始文件名并提取后缀
//            String originalFilename = file.getOriginalFilename();
//            //获取文件的后缀名[.jpg]
//            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//            //生成一个全球唯一的随机字符串,作为新的文件名
//            // 新文件名：UUID + 后缀
//            String fileName = UUID.randomUUID()+ suffix;
//
//            // 构建文件路径
//            // Path filePath = Paths.get(uploadDir + fileName);
//            // 构建文件路径时更安全的方式
//            Path filePath = Paths.get(uploadDir, fileName);
//
//            try {
//                // 创建目录（如果不存在）
//                Files.createDirectories(filePath.getParent());
//
//                // 保存文件
//                file.transferTo(filePath);
//
//                // 构造可访问的URL路径
//                //完整的文件路径 http://localhost:8080/2024/10/19/xxx.jpg
//                //此处没有d:/files,因为后期会把该路径设置为工程的静态文件的根路径
//                // http://localhost:8080/不需要存储进数据库，前端使用BASE_URL + relativeUrl;
//                String relativeUrl =datePath + fileName;
//                fileUrls.add(relativeUrl);
//            } catch (IOException e) {
//                log.error("文件上传失败：{}", fileName, e);
//                return ResponseEntity.status(500).body("上传失败");
//            }
//        }
//
//        log.debug("上传图片成功，文件路径：{}", fileUrls);
//        return ResponseEntity.ok().body(Collections.singletonMap("urls", fileUrls));
//    }
    @Override
    public ResponseEntity<?> uploadImages(MultipartFile[] files, String type) {
        String uploadDir = baseDir + type;

        List<String> fileUrls = new ArrayList<>();

        for (MultipartFile file : files) {
            if (file.isEmpty()) {
                continue; // 跳过空文件
            }

            log.debug("开始处理上传图片业务，参数：{}", file);
            String fileName = UUID.randomUUID() + getFileSuffix(file);
            Path filePath = Paths.get(uploadDir, fileName);
            log.debug("开始处理图片文件名，参数：{}", fileName);
            try {
                Files.createDirectories(filePath.getParent());
                file.transferTo(filePath);
                String relativeUrl = "/" + type + "/" + fileName; // ✅ 加上斜杠，确保可访问
                fileUrls.add(relativeUrl);
            } catch (IOException e) {
                return ResponseEntity.status(500).body("上传失败");
            }
        }
        log.debug("上传图片成功，文件路径：{}", fileUrls);
        return ResponseEntity.ok().body(Collections.singletonMap("urls", fileUrls));
    }

private String getFileSuffix(MultipartFile file) {
    String name = file.getOriginalFilename();
    return name != null ? name.substring(name.lastIndexOf(".")) : ".jpg";
}


    @Override
    public void deleteImages(List<String> filePaths) {
        log.debug("开始处理批量删除图片业务，路径列表：{}", filePaths);

        if (filePaths == null || filePaths.isEmpty()) {
            throw new ServiceException(StatusCode.FAILED,"修改用户信息失败");
        }

        List<String> failedFiles = new ArrayList<>();

        for (String filePath : filePaths) {
            // 构建完整路径
            Path fullFilePath = Paths.get(baseDir + filePath);

            try {
                // 检查文件是否存在并尝试删除
                if (Files.exists(fullFilePath)) {
                    Files.delete(fullFilePath);
                    log.debug("文件删除成功: {}", fullFilePath);
                } else {
                    log.warn("文件不存在，跳过删除: {}", fullFilePath);
                    failedFiles.add(filePath);
                }
            } catch (IOException e) {
                log.error("文件删除失败: {}", fullFilePath, e);
                failedFiles.add(filePath);
            }
        }
        log.debug("批量删除图片完成，失败文件列表：{}", failedFiles);
    }



}
